package com.ATMDemo;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

/*
ATM
*/
public class ATM {
    ArrayList<Account> accounts = new ArrayList<>();
    Scanner sc = new Scanner(System.in);
    Account loginAcc;

    //定义启动方法start（）
    public void start() {
        while (true) {
            System.out.println("==========欢迎你进入ATM系统==========");
            System.out.println("1、用户登录");
            System.out.println("2、用户开户");
            System.out.println("3、结束程序");
            System.out.println("请选择：");
            int command = sc.nextInt();
            switch (command) {
                case 1:
                    //用户登录
                    login();
                    break;
                case 2:
                    //用户开户
                    creatAccount();
                    break;
                case 3:
                    System.exit(0);
                default:
                    System.out.println("没有该操作！");
            }
        }
    }

    /**
     * 账号登录功能
     */
    private void login() {
        System.out.println("=====欢迎进入登录界面=====");
        //判断账号列表里面有没有账号 存在
        if (accounts.size() == 0) {
            return;
        }

        while (true) {
            System.out.println("请输入您的账号：");
            String cardId = sc.next();
            //判断这个卡号是否存在
            Account acc = getAccountCardById(cardId);
            if (acc == null) {
                System.out.println("对不起，您还没有注册账号信息！");
            } else {
                System.out.println("请您输入您的密码：");
                String password = sc.next();
                if (acc.getPassword().equals(password)) {
                    //获取成功登录的用户
                    loginAcc = acc;
                    System.out.println("恭喜" + acc.getUserName() + "成功登录系统,您的账号为" + acc.getCardId());
                    //调用用户登录成功后的功能
                    logincommand();
                    return;
                } else {
                    System.out.println("密码不正确！");
                }
            }
        }

    }

    //登录进去后要提示操作功能
    private void logincommand() {
        while (true) {
            System.out.println(loginAcc.getUserName() + "请您输入您的指令：");
            System.out.println("1、查询账户");
            System.out.println("2、存款");
            System.out.println("3、取款");
            System.out.println("4、转账");
            System.out.println("5、密码修改");
            System.out.println("6、退出");
            System.out.println("7、注销当前账户");
            //获取用户输入的命令
            int command = sc.nextInt();
            switch (command) {
                case 1:
                    //查询账户
                    showLoginAccountInformation();
                    break;
                case 2:
                    //存款
                    inMoney();
                    break;
                case 3:
                    //取款
                    toMoney();
                    break;
                case 4:
                    //转账
                    transferMoney();
                    break;
                case 5:
                    //密码修改
                    rePassword();
                    break;
                case 6:
                    //退出
                    System.out.println("退出当前步骤！");
                    return;
                case 7:
                    //注销当前账户
                    delAccount();
                    break;
                default:
                    System.out.println("您输入的命令有误，请您在(1~7)重新输入！");

            }
        }
    }


    //展示登录用户的所有信息
    private void showLoginAccountInformation() {
        System.out.println(loginAcc.getUserName() + "您的账号信息如下：");
        System.out.println("卡号：" + loginAcc.getCardId());
        System.out.println("户主：" + loginAcc.getUserName());
        System.out.println("性别：" + loginAcc.getSex());
        System.out.println("余额：" + loginAcc.getMoney());
        System.out.println("每次取现额度：" + loginAcc.getLimit());
    }

    //登录成功用户存款功能
    private void inMoney() {
        System.out.println("请输入您要存的金额：");
        double com = sc.nextDouble();
        loginAcc.setMoney(loginAcc.getMoney() + com);
        System.out.println("您的总额还有：" + loginAcc.getMoney());
    }

    //登录成功用户取款功能
    private void toMoney() {
        while (true) {
            System.out.println("请输入您要取的金额：");
            double to = sc.nextDouble();
            if (to > loginAcc.getLimit()) {
                System.out.println("超过取款额度，最多取" + loginAcc.getLimit());
            } else {
                loginAcc.setMoney(loginAcc.getMoney() - to);
                System.out.println("您的总额还有：" + loginAcc.getMoney());
                return;
            }
        }

    }

    //转账功能
    private void transferMoney() {
        System.out.println("===用户转账===");
        if (accounts.size() < 2) {
            System.out.println("当前系统只有你一个账户，不能进行转账操作！");
            return;
        }
        if (loginAcc.getMoney() == 0) {
            System.out.println("你自己都没钱，还有脸点转账！！！");
            return;
        }
        //开始让用户输入对方卡号
        while (true) {
            System.out.println("请你输入要转账的卡号：");
            String cardId = sc.next();
            Account acc = getAccountCardById(cardId);
            if (acc == null) {
                System.out.println("您输入的账号不存在！");
            } else {
                //对方账户存在，让用户输入对方账号名的姓氏，进行判断
                String name = "*" + acc.getUserName().substring(1);
                System.out.println("请输入【" + name + "】的姓氏：");
                String prename = sc.next();
                //判断是否正确
                if (acc.getUserName().startsWith(prename)) {
                    while (true) {
                        System.out.println("请你输入要转的金额：");
                        double money = sc.nextDouble();
                        if (loginAcc.getMoney() < money) {
                            System.out.println("您的金额不足，你最多能转" + loginAcc.getMoney());
                        } else {
                            loginAcc.setMoney(loginAcc.getMoney() - money);
                            acc.setMoney(acc.getMoney() + money);
                            return;
                        }
                    }

                } else {
                    System.out.println("姓氏有问题！");
                }
            }
        }
    }

    //登录成功用户修改密码功能
    private void rePassword() {
        System.out.println("请输入您要修改的密码：");
        String newpassword = sc.next();
        loginAcc.setPassword(newpassword);
        System.out.println("您的密码修改成功！");
    }


    //注销当前账户
    private void delAccount() {
        for (int i = 0; i < accounts.size(); i++) {
            Account delId = accounts.get(i);
            if (delId.getCardId().equals(loginAcc.getCardId())) {
                accounts.remove(i);
                System.out.println("账户删除成功，退出系统！");
                System.exit(0);
            } else {
                System.out.println("找不到该账户的信息！");
            }
        }
    }

    /**
     * 完成用户开户操作
     */
    private void creatAccount() {
        //创建Account账户对象
        Account acc = new Account();
        //需要用户输入账户信息，并赋值给账户对象
        System.out.println("=====请输入以下账户的信息=====");
        System.out.println("请您输入您的账户名称：");
        String name = sc.next();
        acc.setUserName(name);

        //设置性别
        while (true) {
            System.out.println("请您输入您的性别：");
            char sex = sc.next().charAt(0);//男
            if (sex == '男' || sex == '女') {
                acc.setSex(sex);
                break;
            } else {
                System.out.println("您输入的性别有误，请重新输入！只能男或女~");
            }
        }

        //设置密码
        while (true) {
            System.out.println("请您输入您要设置的密码：");
            String passWord = sc.next();
            System.out.println("请您输入确认密码：");
            String okPassWord = sc.next();
            if (passWord.equals(okPassWord)) {
                acc.setPassword(passWord);
                break;
            } else {
                System.out.println("你输入的两次密码不一致，请重新输入！");
            }
        }

        System.out.println("请您输入您的取现额度：");
        double limitmoney = sc.nextDouble();
        acc.setLimit(limitmoney);


        //生成不重复的卡号
        String newCardId = createCadId();
        acc.setCardId(newCardId);
        //把信息存入到账户对象里面去
        accounts.add(acc);
        System.out.println("恭喜" + acc.getUserName() + "开户成功,您的卡号是:" + acc.getCardId());
    }

    private String createCadId() {
        //生成八位随机数
        while (true) {
            String cardId = "";
            Random r = new Random();
            for (int i = 0; i < 8; i++) {
                int randemId = r.nextInt(8);
                cardId += randemId;
            }
            //调用getAccountCardById方法判断卡号是否重复
            Account okcardResout = getAccountCardById(cardId);
            if (okcardResout == null) {
                return cardId;
            }
        }
    }

    //判断生成的卡号是否重复
    private Account getAccountCardById(String cardId) {
        for (int i = 0; i < accounts.size(); i++) {
            Account subaccount = accounts.get(i);
            //判断账号列表里面有没有相同的账号
            if (subaccount.getCardId().equals(cardId)) {
                return subaccount;
            }
        }
        return null;
    }
}
